<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // Object.prototype.toString.call() 、 instanceof 以及 Array.isArray()
      // Object.prototype.toString.call() 所有继承自Object的类都有一个tostring方法 可以通过tostring来判断浏览器内置的类型
      class Person {}
      function fn() {}
      let person = new Person();
      // let arr=[]
      // instanceof 判断实例的[[prototype]]也就是通过原型链是否能找到构造器的原型
      // dog 就是实例他的[[prototype]]绑定的就是Dog的原型所以为true
      class Dog {}
      let dog = new Dog();
      // Array.isArray

      // instanceof 与 isArray
      // 当检测Array实例时，Array.isArray 优于 instanceof ，因为 Array.isArray 可以检测出 iframes
      var iframe = document.createElement("iframe");
      document.body.appendChild(iframe);
      xArray = window.frames[window.frames.length - 1].Array;
      var arr = new xArray(1, 2, 3); // [1,2,3]

      // Correctly checking for Array
      Array.isArray(arr); // true
      console.log(Object.prototype.toString.call(arr)); // true
      // Considered harmful, because doesn't work though iframes
      arr instanceof Array; // false
      // Array.isArray() 与 Object.prototype.toString.call()
      // Array.isArray()是ES5新增的方法，当不存在 Array.isArray() ，可以用 Object.prototype.toString.call() 实现。
      Array.isArray = function (arg) {
        return Object.prototype.toString.call(arg) === "[object Array]";
      };
    </script>
  </body>
</html>
